// src/utils/auth.ts

import { RouteObject } from "react-router-dom";
import { RoleType } from "@types/store"; // TypeScript 类型：角色可能的枚举

/**
 * 判断当前路由 meta.roles 是否允许当前用户访问
 */
function hasPermission(route: RouteObject, roles: RoleType[]): boolean {
  if (route.meta && route.meta.roles) {
    // 如果 route.meta.roles 中至少有一个角色包含于 userRoles，则有权限
    return roles.some((role) => route.meta!.roles!.includes(role));
  } else {
    // 如果路由未设置 meta.roles，则默认可以访问
    return true;
  }
}

/**
 * 递归过滤异步（动态）路由表，返回符合当前用户角色的路由
 * @param routes 待过滤的路由数组
 * @param roles   当前用户所拥有的角色列表
 */
export function filterAsyncRoutes(
  routes: RouteObject[],
  roles: RoleType[]
): RouteObject[] {
  const res: RouteObject[] = [];

  routes.forEach((route) => {
    // 深拷贝一份 route 对象，防止修改原始路由配置
    const tmp = { ...route };

    if (hasPermission(tmp, roles)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles);
      }
      res.push(tmp);
    }
  });

  return res;
}

/**
 * 根据过滤后的路由生成侧边栏菜单数据（如果需要，可在 Ant Design Menu 组件中使用）
 * 这里只是示例：将路由转换成 { key, icon, label, children } 结构
 */
export function generateMenu(routes: RouteObject[]): any[] {
  return routes
    .filter((route) => route.meta && !route.meta.hidden) // 过滤掉 hidden=true 的路由
    .map((route) => {
      const item: any = {
        key: route.path,
        icon: route.meta?.icon,
        label: route.meta?.title,
      };
      if (route.children && route.children.length > 0) {
        item.children = generateMenu(route.children);
      }
      return item;
    });
}

// src/utils/auth.ts

const TokenKey = "my_admin_token";

export function getToken(): string | null {
  return localStorage.getItem(TokenKey);
}

export function setToken(token: string): void {
  localStorage.setItem(TokenKey, token);
}

export function removeToken(): void {
  localStorage.removeItem(TokenKey);
}
// src/utils/auth.ts （续）

/**
 * 判断当前路由 path 是否可访问（用户角色是否满足）
 * @param path 路由 path
 * @param roles 用户角色列表
 * @param routes 异步路由列表
 */
export function canAccessPath(
  path: string,
  roles: RoleType[],
  routes: RouteObject[]
): boolean {
  // 简单递归查找该 path 对应的路由，并检查其 meta.roles
  for (const route of routes) {
    if (route.path === path) {
      if (!route.meta?.roles) return true
      return roles.some(role => route.meta!.roles!.includes(role))
    }
    if (route.children) {
      const found = canAccessPath(path, roles, route.children)
      if (found) return true
    }
  }
  return false
}

